import Taro from "@tarojs/taro";

const util = {
    isObject(arg) {
        return Object.prototype.toString.call(arg) === '[object Object]'
    },

    isArray(arg) {
        return Object.prototype.toString.call(arg) === '[object Array]'
    },

    /**
 * 对象转 url 参数方法
 * @param [Obectj(必填)] 
 * Note: 默认返回空字符串
 * @return (String) 解析后的url参数
 */
    toQueryString(obj) {
        if (!isObject(obj) || JSON.stringify(obj) === "{}") {
            return ''
        }

        let query = ''
        for (let i in obj) {
            query += `&${i}=${obj[i]}`
        }

        return query.replace(/&/, '?').trim()
    },

    deepCopy(arg) {
        try {
            return JSON.parse(JSON.stringify(arg))
        } catch (err) {
            console.log('deepCopy error.')
            if (this.isArray(arg)) {
                return []
            } else {
                return {}
            }
        }
    },
    /* 时间处理 */
    getTimeStr() {
        var currentTime = new Date();
        var arr = []
        arr[0] = currentTime.getFullYear();
        arr[1] = currentTime.getMonth() + 1;
        arr[2] = currentTime.getDate();
        if (arr[1] < 10) { arr[1] = "0" + arr[1] }
        if (arr[2] < 10) { arr[1] = "0" + arr[2] }
        var str = arr.join("/");
        return str
    },
}

util.Taro = {
    // 显示 loading 提示框 
    showLoading(options = {}) {
        if (typeof options === 'string') {
            let title = options
            options = {
                title
            }
        }

        Taro.showLoading(Object.assign({
            title: '处理中 ...'
        }, options))
    },

    /**
     * 显示模态弹窗方法
     * @param [Obectj(可选)(传字符串则为 content 内容)]
     * Note: 默认是发生错误时的提示，原生方法上增加 confirm、cancel 回调方法
     * @return
     */
    showModal(options = {}) {
        if (typeof options === 'string') {
            let content = options
            options = {
                content
            }
        }

        Taro.showModal(Object.assign({
            title: '提示',
            content: '发生错误，请稍后重试',
            showCancel: false,
            success(res) {
                if (res.confirm) {
                    options.confirm && options.confirm(res)
                }
                if (res.cancel) {
                    options.cancel && options.cancel(res)
                }
            }
        }, options))
    },

    /**
     * 显示消息提示框方法
     * @param [Obectj(可选)(传字符串则为 title 内容)]
     * Note: 原生方法上增加 cb 回调方法,用来隐藏提示框
     * @return
     */
    showToast(options = {}) {
        if (typeof options === 'string') {
            let title = options
            options = {
                title
            }
        }

        Taro.showToast(Object.assign({
            title: '提示',
            icon: 'none',
            success(res) {
                if (typeof options.cb === 'function') {
                    setTimeout(() => {
                        options.cb(res)
                    }, options.duration || 1500)
                }
            }
        }, options))
    },

    /**
     * 判断当前是否是 tabbar 页面方法
     * @param [String(可选)]
     * Note: 默认判断当前页面、可传入页面的 route
     * @return
     */
    isTabbarPage(route) {
        if (!__wxConfig || !__wxConfig.tabBar) {
            return false
        }

        if (!route) {
            route = this.getPage().route
        }

        return __wxConfig.tabBar.list.includes(`${route}.html`)
    },

    /**
     * 获取某个页面栈方法
     * @param [String(可选)]
     * Note: 默认当前页面、可传入页面的 route
     * @return
     */
    getPage(route) {
        let currentPages = getCurrentPages()
        let page = null

        if (route) {
            page = currentPages.find(item => {
                return item.route === route
            })
        } else {
            page = currentPages[currentPages.length - 1]
        }

        return page
    },

    /**
     * 刷新页面方法
     * @param [String(可选)、Obectj(可选)]
     * Note: 刷新当前页面
     * @return
     */
    reload(reloadType = 'redirectTo') {
        let page = this.getPage()
        if (this.isTabbarPage(page.route)) {
            reloadType = 'switchTab'
        }

        let query = util.toQueryString(page.options),
            url = `/${page.route}${query}`

        Taro[reloadType]({
            url
        })
    },

    /**
   * 检查版本库是否满足
   * @param [String(可选)] 最低版本库 默认 1.9.0
   * Note: 版本库格式 Major.Minor.Patch（主版本号.次版本号.修订号）
   * @return Boolean
   */
    requireSDKVersion(leastSDKVersion = '1.9.0') {
        function compareVersion(v1, v2) {
            v1 = v1.split('.')
            v2 = v2.split('.')
            let len = Math.max(v1.length, v2.length)

            while (v1.length < len) {
                v1.push('0')
            }
            while (v2.length < len) {
                v2.push('0')
            }

            for (let i = 0; i < len; i++) {
                let num1 = parseInt(v1[i])
                let num2 = parseInt(v2[i])

                if (num1 > num2) {
                    return true
                } else if (num1 < num2) {
                    return false
                }
            }

            return true
        }

        if (typeof Taro.getExtConfigSync !== 'function') {
            return false
        }

        let SDKVersion = Taro.getSystemInfoSync().SDKVersion
        return compareVersion(SDKVersion, leastSDKVersion)
    },

    // 设置缓存
    setStorageSync(key, value = '') {
        try {
            if (typeof value === 'object') {
                value = JSON.stringify(value)
            }
            return Taro.setStorageSync(key, value)
        } catch (e) {
            // wx.clearStorageSync()
            return ''
        }
    },
}

export default util